﻿using System;
using System.Collections.Generic;
using System.Data;
using System.Linq;
using BLToolkit.Data.Linq;
using Calendar.Logic.Core;
using Calendar.Logic.ObjectManager.Authorization;
using Calendar.Logic.ObjectModel;
using Calendar.Logic.ObjectModel.Authorization;

namespace Calendar.Logic.ObjectManager
{
    public class EventUserManager : BaseManager<EventUserManager, EventUser, Event, User>
    {
        public List<EventUser> SelectAll()
        {
            return Table.ToList();
        }

        public List<EventUser> SelectByEvent(int eventId)
        {
            return Table.Where(r => r.FRS_ID == eventId).ToList();
        }

        public List<int> SelectUserIdsByEvent(int eventId)
        {
            return Table.Where(r => r.FRS_ID == eventId).Select(r => r.SCN_ID).ToList();
        }

        public Dictionary<string, string> SelectManagersByEvent(int eventId)
        {
            var managerIds = Table.Where(r => r.FRS_ID == eventId).Select(r => r.SCN_ID).ToList();
            return UserManager.Table.Where(p => managerIds.Contains(p.ID)).ToDictionary(p => p.ID.ToString(), p => p.Name + " " + p.FamilyName);
        }

        public void AddUsersToEvent(int eventId, int[] userIds)
        {
            foreach (var id in userIds)
            {
                var eventUser = CreateInstance();
                eventUser.FRS_ID = eventId;
                eventUser.SCN_ID = id;
                eventUser.Color = EventColors.Purple;
                Insert(eventUser);
            }
        }

        public void RemoveUsersFromEvent(int eventId, int[] userIds)
        {
            try
            {
                foreach (var id in userIds)
                {
                    Table.Where(r => r.FRS_ID == eventId && r.SCN_ID == id).Delete();
                }
            }
            catch (Exception e)
            {
                new ManagerException("Не удалось удалить. Запись используется в системе");
            }
        }

        public void SetAuthorForEvent(int eventId, int userId)
        {
            var field = Table.Where(e => e.FRS_ID == eventId && e.SCN_ID == userId).FirstOrDefault();
            if (field != null)
            {
                field.Author = true;
                try
                {
                    Update(field);
                }
                catch (DataException e)
                {
                    throw new ManagerException("Запись используется в системе");
                }
            }
            else
            {
                throw new ManagerException("Не удалось найти данное событие");
            }
        }


        public int SelectAuthorIdForEvent(int eventId)
        {
            EventUser eventUser = Table.Where(e => e.FRS_ID == eventId && e.Author).FirstOrDefault();
            if (eventUser != null)
                return eventUser.SCN_ID;
            return 0;
        }


        public EventUser SelectAuthorForEvent(int eventId)
        {
            return Table.Where(e => e.FRS_ID == eventId && e.Author).FirstOrDefault();
        }

        public EventUser SelectByUserAndEvent(string username, int eventId)
        {
            var userId = UserManager.Table.SelectByName(username).Select(u => u.ID).SingleOrDefault();
            return Table.Where(e => e.FRS_ID == eventId && e.SCN_ID == userId).FirstOrDefault();
        }

        public int[] SelectUsersForEventNotAuthor(int eventId)
        {
            return Table.Where(e => e.FRS_ID == eventId && !e.Author).Select(e => e.SCN_ID).ToArray();
        }

        public void SetColorForUser(int eventId, int userId, EventColors color)
        {
            var e = Table.Where(ev => ev.FRS_ID == eventId && ev.SCN_ID == userId).FirstOrDefault();
            try
            {
                if(e != null)
                {
                    e.Color = color;
                    Update(e);
                }
                else
                {
                    throw new ManagerException("Несуществующая запись");
                }

            }
            catch(DataException ex)
            {
                throw new ManagerException("Запись используется в системе. Ошибка");
            }
        }
    }
}
